package com.tbit.uqbike.service.business;

import com.tbit.uqbike.object.business.PageData;
import com.tbit.uqbike.object.pojo.Account;
import com.tbit.uqbike.object.pojo.AccountUser;
import com.tbit.uqbike.object.pojo.vo.AreaVO;
import com.tbit.uqbike.object.pojo.vo.CuServiceConfigVO;
import com.tbit.uqbike.object.pojo.vo.LoginLogVO;
import com.tbit.uqbike.object.value.LoginInfo;
import com.tbit.uqbike.object.view.AccountRole;
import com.tbit.common.entity.view.PageResult;
import com.tbit.common.entity.view.Result;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 账户service
 *
 * @author Leon
 * 2017年2月24日 下午4:09:17
 */
public interface AccountService {

    /**
     * 发送验证码
     *
     * @param brandId
     * @param country
     * @param phone
     * @param type
     */
    void sendCode(Integer brandId, String country, String phone, String type, LoginInfo loginInfo);

    /**
     * @param account
     * @param phone
     * @param code
     * @return void
     * @Description:短信选择
     * @createDate 2020/10/23 16:50
     */
    void chooseSMSTemplate(Account account, String country, String phone, String code);

    /**
     * 验证验证码
     *
     * @param brandId
     * @param country
     * @param phone
     * @param code
     * @param type
     * @return
     */
    String verifyCodeLogin(Integer brandId, String country, String phone, String code, String type, HttpServletRequest request);

    /**
     * 获取指定用户信息
     *
     * @param loginInfo
     * @param accountId
     * @return
     */
    Account getAccountById(LoginInfo loginInfo, Integer accountId);

    AccountUser getAccountUserInfoById(LoginInfo loginInfo);

    Account getById(Integer accountId);

    /**
     * 修改密码
     *
     * @param loginInfo
     * @param password
     */
    void editPsd(LoginInfo loginInfo, String password);

    /**
     * 获取品牌列表
     *
     * @param loginInfo
     * @param type
     * @param brandId
     * @param franchiseIds
     * @return
     */
    List<Account> getAccountList(LoginInfo loginInfo, Integer type, Integer brandId, List<Integer> franchiseIds, Double version);

    /**
     * 添加账号
     *
     * @param account
     * @param loginInfo
     */
    void insert(Account account, LoginInfo loginInfo);

    /**
     * 修改账号
     *
     * @param account
     * @param loginInfo
     */
    void edit(Account account, LoginInfo loginInfo);

    /**
     * 删除账号
     *
     * @param accountId
     * @param loginInfo
     */
    void del(Integer accountId, LoginInfo loginInfo);


    /**
     * 获取所有运营区域
     *
     * @param accountId
     * @param loginInfo
     */
    List<Account> getOperationAccountIds(Integer accountId, LoginInfo loginInfo);

    /**
     * 获取账户下所有代理商
     *
     * @param loginInfo
     * @return
     */
    List<Account> getAccount(String name, String phone, Integer type, Integer rowCount,
                             Integer pageNO, LoginInfo loginInfo);

    /**
     * 获取账号树
     *
     * @param rowCount
     * @param pageNO
     * @param info
     * @return
     */
    PageData<List<AccountRole>> getAccountTree(Integer rowCount, Integer pageNO, LoginInfo info, String name);

    /**
     * 获取总数
     *
     * @param name
     * @param phone
     * @param type
     * @param loginInfo
     * @return
     */
    Integer getTotal(String name, String phone, Integer type, LoginInfo loginInfo);

    /**
     * 获取品牌下的所有运营区域Id
     *
     * @return
     */
    List<Integer> getByBrandId(Integer accountId);

    /**
     * 获取登录用户下的所有运营商Id
     *
     * @return
     */
    List<Integer> getAllOperateAccountId(LoginInfo loginInfo);

    /**
     * 获取代理商
     *
     * @param name
     * @return
     */
    List<Account> getByName(LoginInfo loginInfo, String name);

    /**
     * 获取父节点
     *
     * @param loginInfo
     * @param name
     * @return
     */
    List<Integer> getUp(LoginInfo loginInfo, Integer accountId);

    /**
     * 根据父节点获取
     *
     * @param parentIds
     * @return
     */
    List<Integer> getByParentId(Integer parentIds);

    /**
     * 获取品牌Id
     *
     * @param accountId
     * @return
     */
    Integer getBrandId(Integer accountId);

    /**
     * 通过区域id获取品牌id
     *
     * @param accountId
     * @return
     */
    Account getAgentId(Integer accountId);

    /**
     * 通过品牌id或加盟商id获取区域id
     *
     */
    List<Account> getByIdAndType(Integer accountId, Integer type);

    PageData<List<Account>> getAccountTree1(LoginInfo info, String name, Integer rowCount, Integer pageNO);

    List<Account> getAllAccountId(Integer id);

    /**
     * 获取品牌下的所有运营区域
     *
     * @param brandId
     * @return
     */
    List<AreaVO> getAreaByBrandId(Integer brandId);

    /**
     * 获取品牌旗下所有AccountId,包括自己
     *
     * @return
     */
    List<Integer> getAllId(Integer brandId);

    /**
     * 查询后台用户登录日志
     *
     * @param phone     用户手机号
     * @param userName  用户姓名
     * @param page      页码
     * @param size      每页显示条数
     * @param accountId 品牌id
     * @return 登录记录
     */
    PageResult<LoginLogVO> selectAccountLoginLog(String phone, String userName, Integer page, Integer size, Integer accountId, Long startTime, Long endTime);

    Integer getBrandIdByAccountId(Integer accountId, int type);

    /**
     * 根据账户id查询品牌id
     *
     * @param accountId 。
     * @return 。
     */
    Integer getBrandIdByAccountId(Integer accountId);


    /**
     * 校验密码
     *
     * @param country     国际码   传86
     * @param phone       登录手机号
     * @param password    密码
     * @param loginMethod 登录方式
     * @param brandId 品牌编号
     * @return
     */
    String verifyPasswordLogin(String country, String phone, String password, Integer loginMethod, Integer brandId, HttpServletRequest request);

    /**
     * 内部系统登录
     * @param userName 用户名
     * @param nickName 姓名
     * @param timestamp 时间戳
     * @param secretStr 加密字符串
     * @param request request
     * @return token
     */
    Result<String> loginWithSystem(String userName, String nickName, Long timestamp, String secretStr, HttpServletRequest request);

    /**
     * @description: 编辑账户的的基础信息、客服配置信息
     * @author: mo.shanyong
     * @date: 2024/11/26 16:45
     * @param: accountConfigInfo
     */
    void editAccountServiceInfo(CuServiceConfigVO accountConfigInfo,LoginInfo userInfo);

    List<Account> getByPhone(String phone, String country);

    /**
     * @description: 通过当前登录用户，获取用户可以获取到的所有区域
     * @author: mo.shanyong
     * @date: 2025/2/27 15:58
     * @param: info  当前用户
     * @return: java.util.List<com.tbit.uqbike.object.pojo.Account>
     */
    List<Account> getAccountByLoginUser(LoginInfo info);

    /**
     * 根据用户id获取用户绑定区域
     *
     * @param userId 用户id
     */
    List<Account> getAccountByUserBind(Integer userId);

    /**
     * 划拨区域：将当前区域划拨到另一个代理商下
     *
     * @param accountId 区域id
     * @param newAgent  划拨后代理商id
     */
    void transferAccount(Integer accountId, Integer newAgent);

    /**
     * 根据区域id获取代理商列表:当前区域的代理商是代理商列表的第一个
     *
     * @param accountId 区域id
     */
    List<Account> getAgentsByAccountId(Integer accountId);
}